// 2550_Knetudenntui
#include "./USB/usb_function_cdc.h"
#include "GenericTypeDefs.h"
#include "Compiler.h"
#include "usb_config.h"
#include "USB/usb_device.h"
#include "USB/usb.h"
#include "HardwareProfile.h"
#include <delays.h>
//#include <timers.h>
//#include <adc.h>
//#include <stdio.h>
//#include <i2c.h>
#include <math.h>
#pragma config FOSC=HSPLL_HS, PLLDIV=5, CPUDIV=OSC1_PLL2
#pragma config USBDIV=2, PWRT=ON, FCMEN=ON, IESO=ON
#pragma config BOR=ON, BORV=0, WDT=OFF, LVP=OFF, VREGEN=ON
#pragma config MCLRE=ON, PBADEN=OFF, WDTPS=1024
#pragma config LPT1OSC=OFF, CCP2MX=OFF, DEBUG=OFF
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF
#pragma config CPD=OFF, WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF
#pragma config WRTB=OFF, WRTC=OFF, WRTD=OFF, EBTR0=OFF
#pragma config EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF
#define Delay_10uS Delay10TCYx(12)
#define Delay_50uS Delay100TCYx(6)
#define Delay_100uS Delay100TCYx(12)
#define Delay_500uS Delay1KTCYx(6)
#define Delay_1mS Delay1KTCYx(12)
#define Delay_2mS Delay1KTCYx(24)
#define Delay_5mS Delay10KTCYx(6)
#define Delay_10mS Delay10KTCYx(12)
#define Delay_20mS Delay10KTCYx(24)
#define Delay_100mS Delay10KTCYx(120)
#pragma udata
unsigned long A;
unsigned int AA;
unsigned char i,ii,j,ck,B;
char a[12];
char buf[12];
char input_buffer[64];
char output_buffer[64];
void main(void);
void YourHighPriorityISRCode();
void YourLowPriorityISRCode();
void ProcessIO(void);
void UserInit(void);
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = 0x08
void Remapped_High_ISR (void){
_asm goto YourHighPriorityISRCode _endasm
}
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = 0x18
void Remapped_Low_ISR (void){
_asm goto YourLowPriorityISRCode _endasm
}
#pragma code
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode(){
USBDeviceTasks();
}
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode(){
}
#pragma code
void UserInit(void){
PORTAbits.RA0 = 0; // クロック L
PORTAbits.RA3 = 0; // Din L
PORTAbits.RA4 = 1; // CS H
for(i=0; i<12; i++) buf[i] = '0';
for(i=0; i<12; i++) a[i] = '0';
B = 1; A = 0; AA = 0;
}
void main(void){
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTE = 0x00;
TRISA = 0b00000010; // RA1 入力用
TRISB = 0b00000000;
TRISC = 0b00000000;
ADCON1 = 0b00001111; // すべてデジタル
UserInit();
USBDeviceInit();// USB初期化.
while(1){
/* USB接続完了待ち */
if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE))
USBDeviceAttach();
/* デバイス接続状態なら機能実行 */
if((USBDeviceState >= CONFIGURED_STATE)&&(USBSuspendControl!=1)){
ProcessIO();
}
}
}
void ProcessIO(void){
if(getsUSBUSART(input_buffer,20)){
switch(input_buffer[0]) { // 最初の1文字チェック
case '0':
for(j=0;j<2;j++){
if(USBUSARTIsTxTrfReady()) // 送信可能か?
putrsUSBUSART("OK");
CDCTxService();
}
break;
case '1':
AA = 0; A = 0; B = 1;
for(ii=0; ii<10; ii++){
PORTAbits.RA0 = 0; // クロック L
PORTAbits.RA3 = 0; // Din L
PORTAbits.RA4 = 1; // CS H
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
for(ck=1; ck<20; ck++){
if(ck < 3){
PORTAbits.RA4 = 0; // Start
PORTAbits.RA0 = 0;
PORTAbits.RA3 = 1; // Start
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
}
if(ck == 3){
PORTAbits.RA4 = 0;
PORTAbits.RA0 = 0;
PORTAbits.RA3 = 0; // D2=0 CH0
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
}
if(ck == 4){
PORTAbits.RA4 = 0;
PORTAbits.RA0 = 0;
PORTAbits.RA3 = 0; // D1=0 CH0
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
}
if(ck == 5){
PORTAbits.RA4 = 0;
PORTAbits.RA0 = 0;
PORTAbits.RA3 = 0; // D0=0 CH0
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
}
if(ck>5 && ck<8){
PORTAbits.RA0 = 0;
Delay_10uS;
PORTAbits.RA0 = 1;
Delay_10uS;
}
if(ck > 7){ // ck = 8〜19、 B = 1〜12
PORTAbits.RA0 = 0;
Delay_10uS;
PORTAbits.RA0 = 1; // ck が H になるタイミングで データ採取
if(PORTAbits.RA1){
a[12-B] = 1;
}else{
a[12-B] = 0;
}
AA = AA + a[12-B]*pow(2,12-B); // pow は べき乗
Delay_10uS;
B++;
}
}
A = A + AA;
AA = 0; B = 1;
Delay_20mS;
}
A = A/10;
buf[10] = (A%10) + '0'; A = A/10;
buf[9] = (A%10) + '0'; A = A/10;
buf[8] = (A%10) + '0'; A = A/10;
buf[7] = (A%10) + '0';
for(j=0; j<2; j++){ // USB 送信
if(USBUSARTIsTxTrfReady())
putUSBUSART(buf, 12);
CDCTxService();
}
AA = 0; A = 0; B = 1;
PORTAbits.RA0 = 0; // クロック L
PORTAbits.RA3 = 0; // Din L
PORTAbits.RA4 = 1; // CS H
for(i=0; i<12; i++) buf[i] = '0';
for(i=0; i<12; i++) a[i] = '0';
break;
case '2':
A = 0; B = 1;
PORTAbits.RA0 = 0; // クロック L
PORTAbits.RA3 = 0; // Din L
PORTAbits.RA4 = 1; // CS H
for(i=0; i<12; i++) buf[i] = '0';
for(i=0; i<12; i++) a[i] = '0';
break;
default:
break;
}
}
}
// ***********************************************************
// ************** USB Callback Functions *********************
// ***********************************************************
/*************************************************************
* Function: void USBCBSuspend(void)
*************************************************************/
void USBCBSuspend(void)
{
}
/*************************************************************
* Function: void USBCBWakeFromSuspend(void)
*************************************************************/
void USBCBWakeFromSuspend(void)
{
}
/*************************************************************
* Function: void USBCB_SOF_Handler(void)
*************************************************************/
void USBCB_SOF_Handler(void)
{
}
/*************************************************************
* Function: void USBCBErrorHandler(void)
*************************************************************/
void USBCBErrorHandler(void)
{
}
/*************************************************************
* Function: void USBCBCheckOtherReq(void)
*************************************************************/
void USBCBCheckOtherReq(void)
{
USBCheckCDCRequest();
}//end
/*************************************************************
* Function: void USBCBStdSetDscHandler(void)
*************************************************************/
void USBCBStdSetDscHandler(void)
{
}//end
/*************************************************************
* Function: void USBCBInitEP(void)
*************************************************************/
void USBCBInitEP(void)
{
CDCInitEP();
}
/*************************************************************
* Function: void USBCBSendResume(void)
*************************************************************/
void USBCBSendResume(void)
{
static WORD delay_count;
if(USBGetRemoteWakeupStatus() == TRUE)
{
//Verify that the USB bus is in fact suspended, before we send
//remote wakeup signalling.
//if(USBIsBusSuspended() == TRUE)
{
USBMaskInterrupts();
//Clock switch to settings consistent with normal USB operation.
USBCBWakeFromSuspend();
USBSuspendControl = 0;
//USBBusIsSuspended = FALSE; //So we don't execute this code again,
//until a new suspend condition is detected.
delay_count = 3600U;
do
{
delay_count--;
}while(delay_count);
//Now drive the resume K-state signalling onto the USB bus.
USBResumeControl = 1; // Start RESUME signaling
delay_count = 1800U; // Set RESUME line for 1-13 ms
do
{
delay_count--;
}while(delay_count);
USBResumeControl = 0; //Finished driving resume signalling
USBUnmaskInterrupts();
}
}
}
/***************************************************************
* Function: void USBCBEP0DataReceived(void)
***************************************************************/
#if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK)
void USBCBEP0DataReceived(void)
{
}
#endif
/***************************************************************
* Function: BOOL USER_USB_CALLBACK_EVENT_HANDLER(
***************************************************************/
BOOL USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, WORD size)
{
switch(event)
{
case EVENT_TRANSFER:
break;
case EVENT_SOF:
USBCB_SOF_Handler();
break;
case EVENT_SUSPEND:
USBCBSuspend();
break;
case EVENT_RESUME:
USBCBWakeFromSuspend();
break;
case EVENT_CONFIGURED:
USBCBInitEP();
break;
case EVENT_SET_DESCRIPTOR:
USBCBStdSetDscHandler();
break;
case EVENT_EP0_REQUEST:
USBCBCheckOtherReq();
break;
//case EVENT_BUS_ERROR:
//USBCBErrorHandler();
//break;
//case EVENT_TRANSFER_TERMINATED:
//break;
default:
break;
}
return TRUE;
}